package com.tinfeng.oop;

public class JavaAbstractClass {
    // Java抽象类
    // 在面向对象的概念中，所有的对象都是通过类来描绘的，但是反过来，并不是所有的类都是用来描绘对象的，
    // 如果一个类中没有包含足够的信息来描绘一个具体的对象，这样的类就是抽象类。

    // 值得注意的是，一个抽象类不能直接实例化，但类的其他功能依然存在；
    // 既然不能被实例化，那么它必须被继承才能被使用。
    /**
    小猫类、小狗类这些子类都重写了宠物类中的 eat 方法，我们知道每种宠物都有吃的行为，宠物表示了一个抽象的概念。

     两个继承的自雷中都重写了父类的方法，那父类的方法其实就失去意义，这时就可以把父类变成抽象类，只供继承，无法实例化

     那么宠物类的实例化和方法调用就没有了实际意义：
    Pet pet = new Pet();
    pet.eat();

    我们知道了抽象类不能被实例化，此时可以将父类设定为抽象类，使用 abstract 关键字来声明抽象类，abstract 关键字必须放在 class 关键字前面 ：

    // 声明抽象类
    abstract class Pet {
    ...
    }
     */
    // 抽象方法
    /**
     * 抽象类中包含抽象方法，但不用本类中去实现，只需药继承的子类中去实现就ok
     * abstract class Pet {
     *     abstract void eat();
     * }
     *
     * 抽象方法不能是 final、static 和 native 的
     * 也不能是私有的即：private
     * 因为抽象方法一定要被重写，私有、静态、最终方法都不能重写
     * 而 native 是本地方法，它与抽象方法不同的是，它把具体的实现移交给了本地系统的函数库，没有把实现交给子类，因此和 abstract 方法本身就是冲突的。
     */
}
